package org.example;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

/**
 * 算式类的单元测试类（JUnit5）
 */
class ArithmeticExpressionTest {

    // 测试加法算式
    @Test
    void testAddExpression() {
        AbstractExpression addExp = new AddExpression(5, 3);
        assertEquals("5+3", addExp.getExpressionStr()); // 验证算式字符串
        assertEquals(8.0, addExp.getResult()); // 验证结果
        assertTrue(addExp.checkAnswer(8.0)); // 验证答案正确
        assertFalse(addExp.checkAnswer(7.0)); // 验证答案错误
    }

    // 测试除法运算（含小数）
    @Test
    void testDivExpression() {
        ArithmeticExpression exp = new ArithmeticExpression(5, 2, '/');
        assertEquals("5/2", exp.getExpressionStr());
        assertEquals(2.5, exp.getResult());
        assertTrue(exp.checkAnswer(2.5));
    }

    // 测试不合法的运算符（预期抛出异常）
    @Test
    void testInvalidOperator() {
        assertThrows(IllegalArgumentException.class, () -> {
            new ArithmeticExpression(2, 3, '^');
        });
    }

    // 测试减法算式（结果非负）
    @Test
    void testSubtractExpression() {
        // 情况1：被减数大于减数
        AbstractExpression subExp1 = new SubtractExpression(5, 3);
        assertEquals("5-3", subExp1.getExpressionStr());
        assertEquals(2.0, subExp1.getResult());

        // 情况2：被减数小于减数（结果为0）
        AbstractExpression subExp2 = new SubtractExpression(3, 5);
        assertEquals("3-5", subExp2.getExpressionStr());
        assertEquals(0.0, subExp2.getResult()); // 符合非负设计
    }
}
